package br.ufrj.neg.evento.servlet;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.URI;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;
import org.apache.velocity.tools.view.VelocityViewServlet;

import br.ufrj.neg.bean.Idioma;
import br.ufrj.neg.constants.General;
import br.ufrj.neg.evento.bean.ArtefatoBean;
import br.ufrj.neg.evento.bean.TipoArtefatoBean;
import br.ufrj.neg.evento.model.ArtefatoModel;
import br.ufrj.neg.evento.model.TipoArtefatoModel;
import br.ufrj.neg.util.Data;

public class CadastrarArtefatoEventoAction extends VelocityViewServlet{

	private static final long serialVersionUID = -1502095409248120929L;
	//private static Logger log = Logger.getLogger("rootLogger");

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		
		ArtefatoModel am = new ArtefatoModel();
		
		try {
			/*
			 * Pega a sessao
			 */
		
						
			/*
			 * Pega os parametros passados
			 */
			
			InputStream arquivo = null;
			String descricao = new String();
			String nome = new String();
			Integer evento = 0;
			Integer tipoArtefato = 0;
			String uniqueId = new String();
			
			Idioma idioma = (Idioma) request.getAttribute("idioma");
			ArtefatoBean ab = new ArtefatoBean(idioma);
			boolean isMultipart = ServletFileUpload.isMultipartContent(request);
			
			if (isMultipart)
			{
				// Create a new file upload handler
				ServletFileUpload upload = new ServletFileUpload();
	
				// Parse the request
				FileItemIterator iter = upload.getItemIterator(request);
				
				FileItemStream  fitem = null;
				InputStream stream = null;
				while (iter.hasNext())  
				{  
					fitem = (FileItemStream) (iter.next());
				    stream = fitem.openStream();
	
					if (fitem.isFormField())  
					{  
						if(fitem.getFieldName().equals("descricaoArtefato"))  
						{  
							descricao = General.toUTF8( Streams.asString(stream) );  
						}
						else if(fitem.getFieldName().equals("tipoArtefato"))  
						{  
							tipoArtefato = Integer.parseInt(Streams.asString(stream));  
						}
						else if(fitem.getFieldName().equals("idEvento"))  
						{  
							evento = Integer.parseInt(Streams.asString(stream));  
						}
						else if(fitem.getFieldName().equals("domNodeId")){
							
							uniqueId = General.toUTF8( Streams.asString(stream) );
						}
						
					}  
					else  
					{  
						arquivo = fitem.openStream();
						nome = General.toUTF8( fitem.getName() );
						
						break;
					}  
				}  

			}
			else{
				
				nome = URLDecoder.decode( request.getHeader("X-File-Name"),"UTF-8");
				arquivo = request.getInputStream();
				
				descricao = request.getParameter("descricaoArtefato");
				evento = Integer.parseInt(request.getParameter("idEvento"));
				tipoArtefato = Integer.parseInt(request.getParameter("tipoArtefato"));
				uniqueId = request.getParameter("domNodeId");
			}
			
			/*
			 * Monta o NegociacaoBean
			 */
			 
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			int len_buffer = 3000;
			byte buf[] = new byte[len_buffer];
			int lidos = 1;
			
			lidos = arquivo.read(buf,0,3000);
			while( lidos > -1 ){							
				baos.write(buf,0,lidos);	
				lidos = arquivo.read(buf,0,3000);
			}
			
			
			

			
			TipoArtefatoModel tam = new TipoArtefatoModel();
			ab.setDescricao(descricao);
			ab.setNome(nome);	
			ab.setEvento(evento);
			ab.setTipoArtefato(tipoArtefato);
			
			TipoArtefatoBean tab = new TipoArtefatoBean(idioma);
			tab.setId(tipoArtefato);			
			String tipoArtefatoDescricao = tam.getTipoArtefato(tab).getDescricao();
			ab.setTipoArtefatoDescricao(tipoArtefatoDescricao);			
			ab.setArquivoAsByte(baos.toByteArray());
			ab.setData(new Data());
			ab.setDataFormatada(idioma.getData(ab.getData()));
											
			ab.setId(am.cadastraArtefato(ab));
			
			PrintWriter out = response.getWriter();
			
			JSONObject jsonO = new JSONObject();
			JSONObject jsonO2 = new JSONObject();
			
			jsonO.put("success","true");
			jsonO2.put("dataFormatada",ab.getDataFormatada());
			jsonO2.put("id",ab.getId() );
			String temp = URLEncoder.encode(ab.getNome(),"UTF-8");
			jsonO2.put("nome",temp.replaceAll("\\+","%20"));
			jsonO2.put("descricao",ab.getDescricao() );
			
			jsonO.put("unique_id",uniqueId );
			jsonO.put("artefato", jsonO2);
			
			out.print(jsonO);
							
		} catch (Exception e) {
			e.printStackTrace();
			request.getRequestDispatcher(General.TELA_ERRO_500).forward(request,
					response);
		}
	}
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
	
			doPost(request,response);
	}
	
	
}
